﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Web;
using System.Web.Mvc;
using CHILIS.Componentes.Adquicisiones.Models;
using CHILIS.Componentes.BLCoreRestaurant.Class;
using CHILIS.Componentes.CoreRestaurant.Logic.Facade;
using CHILIS.Componentes.CoreRestaurant.Model.Adquicisiones;

namespace CHILIS.Componentes.Adquicisiones.Areas.Administrador.Controllers
{
    public class MainController : Controller
    {
        //
        // GET: /Administrador/Main/

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Menu()
        {
            return PartialView();
        }

        #region "Solicitud de Compra de Insumo"


        public ActionResult SolicitudCompraInsumo()
        {
            ViewBag.ListadoInsumos = BLInsumo.ListarInsumos(0);
            return PartialView();
        }

        public ActionResult SolicitudCompraInsumoList(string tipoSolicitud, string descripcion, DateTime? fechaSol)
        {
            ViewBag.ListadoSolicitudes = BLInsumo.ListadoSolicitudInsumo(tipoSolicitud, descripcion, fechaSol);//Insumo.ListadoSolicitudInsumo(tipoSolicitud, descripcion, fechaSol);
            return PartialView();
        }

        public ActionResult MantSolicitudCompraInsumo(int? numeroSol)
        {
            ViewBag.ListadoInsumos = BLInsumo.ListarInsumos(0);

            if (numeroSol != null)
            {
                if (!BLInsumo.ValidarEstadoSolicitudInsumo((int)numeroSol))
                {
                    //return Content("", "text/html");
                    return new EmptyResult();
                }


                ViewBag.SolicitudInsumo = BLInsumo.ObtenerSolicitudInsumo(numeroSol);
                //Insumo.ObtenerSolicitudInsumo(numeroSol);
            }
            else
            {
                Session["listaInsumo"] = null;
            }
            return PartialView();
        }

        public ActionResult MantSolicitudCompraInsumoList(int? numeroSol)
        {
            ViewBag.ListadoInsumos = BLInsumo.ListarInsumos(0);
            if (numeroSol != null)
            {
                var detalle = BLInsumo.ObtenerDetalleSolicitudInsumo(numeroSol);//Insumo.ObtenerSolicitudInsumo(numeroSol).ListaDetalles;
                //ViewBag.listadoDetalleInsumo = detalle.Select(x => new { x.Codigo_Insumo, x.Cantidad })
                //                                      .ToDictionary(k => Convert.ToInt32(k.Codigo_Insumo), k => Convert.ToInt32(k.Cantidad));
                ViewBag.listadoDetalleInsumo = detalle;
                ViewBag.EsEdicion = true;
                ViewBag.NumeroSolicitud = numeroSol;
            }
            else
            {
                ViewBag.listadoDetalleInsumo = ((Dictionary<int, int>)Session["listaInsumo"]);
                ViewBag.EsEdicion = false;
            }

            return PartialView();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult RegistrarSolicitudInsumo(int Numero_Solicitud, string Tipo_Solicitud, DateTime Fecha_Solicitud, DateTime Fecha_Entrega, string Descripcion)
        {
            bool blnExito = true;
            if (Session["listaInsumo"] != null)
            {
                blnExito = BLInsumo.RegistrarSolicitudInsumo(Numero_Solicitud, Tipo_Solicitud,
                            Fecha_Solicitud, Fecha_Entrega, Descripcion, (Dictionary<int, int>)Session["listaInsumo"]);
            }
            else
            {
                blnExito = false;
            }

            return Json(new { exito = blnExito }, "text/html", JsonRequestBehavior.AllowGet);
        }

        public ActionResult BuscarInsumo(int? numeroSolicitud, int? idInsumo, int? cantidad, string tipoSol)
        {
            if (Session["listaInsumo"] == null)
            {
                var listadoInsumo = new Dictionary<int, int>();
                Session["listaInsumo"] = listadoInsumo;
            }
            ViewBag.ListadoInsumos = BLInsumo.ListarInsumos(0);
            ViewBag.NroSol = numeroSolicitud;
            ViewBag.IdInsumo = idInsumo;
            ViewBag.Cantidad = cantidad;
            ViewBag.TipoSol = tipoSol;
            return PartialView();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult AgregarInsumo(int idInsumo, int? cantidadInsumo, int? numSol, int? idInsumoOld, string tipoSol)
        {
            //bool exito = true;
            Dictionary<int, int> listado = null;
            if (Session["listaInsumo"] != null)
            {
                //Se valida si ingresa una cantidad nulla o menor igual a cero
                if (cantidadInsumo == null || cantidadInsumo <= 0)
                {
                    return Json("C", JsonRequestBehavior.AllowGet);
                }

                //Se debe validar el stock
                if (!BLInsumo.EsValidoStock(idInsumo, (int)cantidadInsumo))
                {
                    return Json("S", JsonRequestBehavior.AllowGet);
                }

                //Si es del tipo regular se debe validar sobre la proyeccion de ventas
                if (tipoSol.Equals("R") && !BLInsumo.EsVentaProyectada(idInsumo, (int)cantidadInsumo))
                {
                    return Json("P", JsonRequestBehavior.AllowGet);
                }

                //Se valida si se encuentra editando el insumo
                if (numSol != null || numSol != -1 || idInsumoOld != null)
                {
                    EliminarDetalleSolIns((int)numSol, (int)idInsumoOld);
                }

                //Se valida si el insumo no existe en el carrito
                if (((Dictionary<int, int>)Session["listaInsumo"]).Count(x => x.Key == idInsumo) == 0)
                {
                    listado = (Dictionary<int, int>)Session["listaInsumo"];
                    listado.Add(idInsumo, (int)cantidadInsumo);
                }


            }
            ViewBag.ListadoInsumos = BLInsumo.ListarInsumos(0);
            ViewBag.listadoDetalleInsumo = listado;

            //return PartialView("MantSolicitudCompraInsumoList");
            return Json("O", JsonRequestBehavior.AllowGet);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult eliminarSolicitudInsumo(int num_sol)
        {
            bool blnExito = true;
            blnExito = BLInsumo.EliminarSolicitudInsumo(num_sol);//Insumo.EliminarSolicitudInsumo(num_sol);
            return Json(new { exito = blnExito }, "text/html", JsonRequestBehavior.AllowGet);
        }

        public ActionResult imprimirSolicitudInsumo(int numSol)
        {
            ViewBag.ReporteSolicitudInsumo = BLInsumo.ObtenerSolicitudInsumo(numSol);//Insumo.ObtenerSolicitudInsumo(numSol);
            ViewBag.ListadoInsumos = BLInsumo.ListarInsumos(0);
            return PartialView();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult eliminarDetalleSolicitudInsumo(int numSol, int codIns)
        {
            bool blnExito = true;
            blnExito = EliminarDetalleSolIns(numSol, codIns);
            return Json(new { exito = blnExito }, "text/html", JsonRequestBehavior.AllowGet);
        }
        /// <summary>
        /// Se elimina del detalle de solicitud
        /// de insumo
        /// </summary>
        /// <param name="numeroSolicitud">Numero de Solicitud</param>
        /// <param name="codigoInsumo">Codigo de Insumo</param>
        /// <returns></returns>
        public bool EliminarDetalleSolIns(int numeroSolicitud, int codigoInsumo)
        {
            bool exito = true;
            if (Session["listaInsumo"] != null)
            {
                Dictionary<int, int> listado = (Dictionary<int, int>)Session["listaInsumo"];
                listado.Remove(codigoInsumo);
                Session["listaInsumo"] = listado;
            }
            else
            {
                exito = false;
            }
            return exito;
        }



        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult validarEstadoSolicitudInsumo(int numSol)
        {
            bool blnExito = BLInsumo.ValidarEstadoSolicitudInsumo(numSol);
            return Json(blnExito.ToString(), "text/html", JsonRequestBehavior.AllowGet);
        }

        #endregion

        #region "Solicitud de Orden de Compra"

        public ActionResult OrdenCompra()
        {
            return PartialView();
        }

        public ActionResult DetalleOrdenCompra()
        {
            ViewBag.ListadoOrdenCompra = BLInsumo.ListadoOrdenCompra(null);

            return PartialView();
        }

        public ActionResult AnularOrdenCompra()
        {
            return PartialView();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult GenerarOrdenCompra(int codigoProveedor)
        {
            //bool blnExito = true;
            int nroOC = -1;
            nroOC = BLInsumo.GenerarOrdenCompra(codigoProveedor);


            if (nroOC != -1)
            {
                //Se envia el correo al proveedor con la OC
                string correoProveedor = BLInsumo.ObtenerProveedor(codigoProveedor).Email_Proveedor;
                List<emailAddress> listadoCorreos = new List<emailAddress>();
                MailAddress mailAddress = new MailAddress(correoProveedor);
                string ruta = Server.MapPath("~/") + "file//" + nroOC + ".pdf";
                Correo.Send("", "lchang@chilis.com", "", listadoCorreos, mailAddress, false, nroOC, ruta);
            }
            return Json(nroOC, "text/html", JsonRequestBehavior.AllowGet);
        }

        public ActionResult BuscarOrdenCompra()
        {
            AD_OrdenCompra orden = BLInsumo.ObtenerOrdenCompraMax();
            if (orden != null)
            {
                ViewBag.OrdenCompra = orden;
                ViewBag.Proveedor = BLInsumo.ObtenerProveedorPorOrdenCompra(orden.Numero_OC);
            }

            return PartialView("AnularOrdenCompra");
        }

        public ActionResult AnulacionOC(int numeroOc, string motivo)
        {
            bool blnExito = true;
            blnExito = BLInsumo.AnulacionOrdenCompra(numeroOc, motivo);

            return Json(blnExito.ToString(), "text/html", JsonRequestBehavior.AllowGet);
        }

        public ActionResult VerDetalleInsumo(int numeroOC, int codigoProveedor)
        {
            ViewBag.Proveedor = BLInsumo.ObtenerProveedor(codigoProveedor);
            ViewBag.ListadoInsumo = BLInsumo.ListarInsumos(0);

            if (numeroOC != -1)
                ViewBag.DetalleOrdenCompra = BLInsumo.ObtenerDetalleOrdenCompra(numeroOC);
            else
                ViewBag.DetalleSolicitudInsumo = BLInsumo.ObtenerDetalleSolicitudInsumoxProveedor(codigoProveedor);

            return PartialView();
        }

        public ActionResult ConsultarOrdenCompra()
        {
                       
            
            return PartialView();
        }

        public ActionResult ConsultarOrdenCompraList()
        {


            return PartialView();
        }

        #endregion


        #region Proyeccion de Ventas

        public ActionResult ProyeccionVenta()
        {
            ViewBag.ListadoProyeccionVenta = BLInsumo.ListadoProyeccionVenta();
            return PartialView();
        }


        #endregion

        #region Reportes

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult ShowGenericReportInNewWin(int numeroOc)
        {
            this.HttpContext.Session["ReportName"] = "CrystalReport1.rpt";
            Session["nroOrdenCompra"] = numeroOc;
            //this.HttpContext.Session["rptFromDate"] = FromDate;
            //this.HttpContext.Session["rptToDate"] = ToDate;
            this.HttpContext.Session["rptSource"] = BLOrdenCompra.RptOrdenCompraXNumeroOrden(numeroOc);

            return Json("O", JsonRequestBehavior.AllowGet);

        }


        #endregion
    }
}
